package com.zsz.ba01;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

import java.util.Date;

/**
 * @Aspect:是aspectj框架中的注解。
 *
 *   作用：表示当前类是切面类。
 *   切面类是用来给业务方法增加功能的类，在这个类中有切面的功能代码
 *   位置：在类定义的上面
 */

@Aspect
public class MyAspect {


    /**
     * @Before:前置通知注解
     *   属性：value，是切入点表达式，表示切面的功能执行位置。
     *   位置：在目标方法的上面
     *
     * 特点：
     *     1.在目标方法执行之前执行
     *     2.不会改变目标方法的执行结果
     *     3.不会影响目标方法执行。
     *
     *
     */
//    @Before(value = "execution(public void com.zsz.ba01.SomeServiceImpl.doSome(String,Integer))")
//    public void myBefore(){
//        System.out.println("前置通知， 切面功能：在目标方法之前输出执行时间："+new Date());
//    }

//    @Before(value = "execution(void com.zsz.ba01.SomeServiceImpl.doSome(String,Integer))")
//    public void myBefore(){
//        System.out.println("1===前置通知， 切面功能：在目标方法之前输出执行时间："+new Date());
//    }

//    @Before(value = "execution(void *..SomeServiceImpl.doSome(String,Integer))")
//    public void myBefore(){
//        System.out.println("2===前置通知， 切面功能：在目标方法之前输出执行时间："+new Date());
//    }

//    @Before(value = "execution(void *..SomeServiceImpl.do*(..))")
//    public void myBefore(){
//        System.out.println("3===前置通知， 切面功能：在目标方法之前输出执行时间："+new Date());
//    }

//    @Before(value = "execution(* *..SomeServiceImpl.do*(..))")
//    public void myBefore2(){
//        System.out.println("4===前置通知， 切面功能：在目标方法之前输出执行时间："+new Date());
//    }


    /**
     * 指定通知方法中的参数 ： JoinPoint
     * joinPoint:业务方法，要加入切面功能的业务方法
     *
     */
    @Before(value = "execution(public void com.zsz.ba01.SomeServiceImpl.doSome(String,Integer))")
    public void myBefore(JoinPoint jp){
        //获取方法的完整定义
        System.out.println("方法的签名（定义）="+jp.getSignature());
        System.out.println("方法的名称"+jp.getSignature().getName());

        //获取方法的实参
        Object[] args = jp.getArgs();
        for (Object arg : args){
            System.out.println("参数="+arg);
        }
        System.out.println("前置通知， 切面功能：在目标方法之前输出执行时间："+new Date());
    }
}
